package cn.ahaoweb.drule.core.listener;

import cn.ahaoweb.drule.core.FactInfo;
import org.kie.api.event.rule.AfterMatchFiredEvent;
import org.kie.api.event.rule.BeforeMatchFiredEvent;
import org.kie.api.event.rule.MatchCancelledEvent;
import org.kie.api.event.rule.MatchCreatedEvent;

/**
 * @Name: RuleExecuteListener
 * @Description:
 * @Author: wangzhonghao
 * @Date: 2025/2/13 17:29
 */
public interface RuleExecuteListener{

    /**
     * 取消条件判断
     * <pre>
     *     规则条件判断结束，如果不满足则触发此事件
     * </pre>
     * @param event
     */
    void matchConditionCancelled(MatchCancelledEvent event, FactInfo factInfo);

    /**
     * 开始条件判断
     * <pre>
     *    开始判断规则的条件是否满足时触发
     * </pre>
     * @param event
     */
    void matchConditionStart(MatchCreatedEvent event, FactInfo factInfo);

    /**
     * 触发规则结果前
     * <pre>
     *    当该规则条件满足，准备执行此规则结果前触发
     * </pre>
     * @param event
     */
    void beforeFireRule(BeforeMatchFiredEvent event, FactInfo factInfo);


    /**
     * 触发规则结果后
     * <pre>
     *    当该规则条件满足，执行此规则结果后触发
     * </pre>
     * @param event
     */
    void afterFireRule(AfterMatchFiredEvent event, FactInfo factInfo);

    /**
     * 是否是单例
     * <pre>
     *     如果不是单例的，每次执行规则都会通过<font color="red">无参构造器方法</font>去实例化一个新的监听器对象。
     * </pre>
     * @return
     */
    default boolean singleton(){
        return true;
    }

}
